約 6,141,223 件
https://w.atwiki.jp/rinn/pages/21.html
□正規表現 チェック用サンプルプログラム javaのregexパッケージを利用した正規表現のマッチングのチェックを行う サンプルプログラムです。 1.reg.javaと言うファイルを新規作成して、 javac reg.java と実行してください。 2.下記の様にして実行すると、正規表現と文字列のマッチングの確認が行えます。 java reg 正規表現パターン 比較を検証したい文字列 reg.java import java.util.regex.*; import java.io.*; /** java reg " パターン文字列 " 比較文字列 */ public class reg { /** * パターンマッチのテストを行い、結果を booleanで返す。 */ public static boolean regMatch(String p, String s) { Pattern pattern = Pattern.compile(p); Matcher matcher = pattern.matcher(s); return matcher.matches(); } public static void main(String[] args) throws Exception { String pt = args[0]; String st = args[1]; System.out.println("Pattern "+pt); System.out.println("Value "+st); try { if ( reg.regMatch(pt,st) ) { System.out.println("Result True"); }else{ System.out.println("Result False"); } } catch (Exception e){ System.err.println(e); e.printStackTrace(); } } }
https://w.atwiki.jp/java_pro/pages/26.html
import java.io.*; public class DrawGraph1_2 { public static void main(String[] args){ for (int i = 0; i 10; i++){ System.out.print(i + " "); for (int j = 0; j i * 2; j++){ System.out.print("*"); } System.out.println(""); } } }
https://w.atwiki.jp/a_kurosawa/pages/15.html
◆Java ◆Java日付の変換 Java SEとかEEとかSDKとかJDSとかJ2SEとかJREとかとか。 EnumクラスをStringにすると、変数の内容消える 自前クラスでのequalsはオーバーライドしないとちゃんと動かない 日付の変換 Date date = DateFormat.getDateInstance().parse(str); getDateInstance()←Date忘れないでね Formatを指定して変換 例えば、Tue, 04 Dec 2012 10 01 05 +0900のような形式。 SimpleDateFormat objFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH mm ss Z", Locale.ENGLISH); Date date = objFormat.parse(str); Local.ENGLISHないとフォーマットできないみたい。 参考 あー、超ハマった。 Java SEとかEEとかSDKとかJDSとかJ2SEとかJREとかとか。 Java SE Java SEとはStandard Editionの略です。 Javaの基本的な関数が入っています。 APIと呼ばれるものです。 例えば、java.lang.Stringとか Java.lang.Systemとかです。 String str = ""; str.equals("あ")とか System.out.print()とか使ったことありませんか? それです。 ちなみにJ2SEというのは、 バージョン1.5(5.0)までの昔の呼び方で、 今はJava SEで統一されているみたいです。 J2の後ろの部分がJava SEのSEの部分なので、 J2EEだったら下のJava EEのこと、 J2MEだったらJava MEと呼ばれるAPIのことです。 Java EE Java EEとはEnterprise Editionの略です。 JavaでWebサイトなどを作る際に必要な関数が入っています。 Servletとかjspの関数などが含まれています。 web.xmlなどをいじってServletクラスを作ったり、 StrutsやSeasarなどのライブラリを使ったことがなければ 縁のない関数かもしれません。 SDK SDKはSoftware Development Kit(ソフトウェア開発キット)の略です。 Javaに関わらずソフトウェアを開発するのに必要なツールが 一式入ってますよというものです。 なのでJavaだと、上で書いたJava SE(Standard Edition)も入っています。 他にはソースを*.classファイルにコンパイル(翻訳)するツール、 作ったアプリケーションを実行する環境などが入っています。 JDK JDKとはJava Development Kit(Java開発キット)の略です。 Javaを開発するのに必要なツールが一式入ってます。 Java専用のSDKということですね。 内容の構成はSDKと同じで、 標準API(Java SE) コンパイラ(*.javaのソースファイルを*.classファイルに翻訳するツール) 実行環境 などが入っています。 JDKはJavaの開発に必要な最低限のツール一式なので、 Java EEは入っていません。 もしかしたらアプレットを作るかもしれませんし、 Webではなく端末上で動くアプリケーションを作るかもしれませんからね。 それらは別途インストールしなければなりません。 補足ですが、JDKのバージョンは1.5、1.6、1.7などありますが、 それらは5.0、6.0、7.0とも呼ばれたりします。 まだ2.0まで行ってないので、1が略されてるみたいですね~。ややこしい。 参考 JRE JREとはJava Runtime Environmentの略です。 上のJDKの項目の実行環境の部分です。 例えば、eclipseなどでアプリケーションを実行する時に必要なツールです。 そのままですが。 コーヒーのマークのたまに更新の通知があがるあのツールです。 このJREにもJava SEやJava EEのように種類があり、 公開JREと非公開JREといいます。 JDKの中に入っているJREは、 JREの中でも基本的なものだけ入っている実行環境です。 これが非公開JREです。 ちなみに非公開JREはJDKの一部というイメージなので、 インストールしたりアンインストールしたりできません。 JDKをアンインストールしたら一緒に消えるという感じです。 更新の通知があがるツールは公開JREです。 参考 EnumクラスをStringにすると、変数の内容消える JavascriptでAjaxでSeasarのActionにアクセスし、 RESULTというEnumを作り、statusとmessageという変数を作成し、 RESULT SUCCESS(0, "成功しました。")のようなのを作って、 返しました。 JavaのEnumの王道の使い方だと思ってたのですが… ResponseUtil.write(JSON.encode(SUCCESS), "text/javascript"); のようにjavascriptに渡すと、 受け取った時に"SUCCESS"というString型になっていて、 statusもmessageもundefinedになります…。。 くそー、JavaのEnumはどう使えっちゅーんだっ 自前クラスでのequalsはオーバーライドしないとちゃんと動かない Javaではクラスは全てObjectを自動的に継承しているので、 equals()を使えるんだが、 そのまま使おうとするとパラメーターが全て一致していても falseが返ってくる。 これはアドレスを見ているからだ。 データが保存されたアドレスはクラスをnewする度に 全く同じインスタンスを比較しないとtrueは返らない。 そこで正しく動作するequals()を実装する為の システムがeclipseには備わっている。 ソースで右クリック→ソース→hashCode() 及び equals() の生成 これを実行するとhashCode()とequals()が自動生成されて 保持しているパラメータが全て一致していればtrueを返す equals()が使えるようになる。 ただし、参考演算子を使っていたり、 if (true) return false; のような括弧を使わないif文などが書かれているので チェックスタイルに引っかかる場合は 自分で直さなくてはいけない。
https://w.atwiki.jp/java_pro/pages/38.html
public class MethodTest { public static ??? getYourName(String myouji, String name){ String[] result; result = ?????; ???? = myouji; ???? = name; return ????; } public static void main(String[] args){ String[] shimei; ???? = getYourName("java", "太郎"); System.out.println("名字は" + ????); System.out.println("名前は" + ????); } }
https://w.atwiki.jp/javaapl/pages/13.html
オブジェクト指向プログラミング言語であり、Javaのプログラムの実行環境および開発環境をいう。 Javaを実行するために必要な物 ソースコード API(J2EE,J2SE等) コンパイラ Java VM (Java Virtual Machine) API あるプラットフォーム(OSやミドルウェア)向けのソフトウェアを開発する際に 使用できる命令や関数の集合のこと。また、それらを利用するためのプログラム上の手続きを定めた規約の集合。 ライブラリの仕様(くわしく説明してある物)のこと。 何かの機能のことも「API」という。 J2SE Javaを使うための最も基本的なAPI(関数)の塊 J2EE Web上でJavaを使うためのちょっと高級なAPI(関数)の塊です。 Java Virtual Machine java実行環境(JRE)のこと。Java仮想マシンのこと。 コンパイルされたソースコードを読み込み、実行するために必要な物。
https://w.atwiki.jp/naobe/pages/25.html
言語に戻る EJB JavaEE5 MBean JMX JNDI サーブレット 言語仕様 項目 説明 transient 修飾子。Seriariseオブジェクトの保管しないフィールドを修飾する。 クラスローダ http //www.techscore.com/tech/Java/JavaEE/Servlet/supplement-1/ 参照 目的 同じ名前でバージョンの異なるクラスを使用するために使う。クラスローダが異なればバージョンが異なっても良い。自分自身のクラスローダを得るにはgetClassLoader()メソッドを用いる。 クラスローダには親子関係があり、子クラスローダがクラスをロードするときには、親クラスローダにロードを依頼してロードできなければ、子クラスローダがロードする。 Class#getClassLoader()は、このクラスをロードしたクラスローダを返す クラスローダによってロードされたClassはパーマネント領域に格納される。ClassLoaderがGCされるとGCから解放される。 VMのクラスローダ ブートストラップクラスローダ JAVA_HOME /lib下のJARファイルに含まれるクラスをロードする。JDK6は、 JAVA_HOME /jre/lib下? 親はいない 拡張クラスローダ JAVA_HOME /lib/ext下のJARファイルに含まれるクラスをロードする。JDK6は、 JAVA_HOME /jre/lib/ext下?親はいない システムクラスローダ CLASSPATHで指定した位置からクラスをロードする。親は拡張クラスローダ。ブートストラップクラスローダは親子関係なしでも委譲されるということでは? 通常のnew Foo()ではこのクラスローダが使われる。 ブートストラップクラスローダ、拡張クラスローダ、システムクラスローダの順番でクラスをロードする。 コンテキストクラスローダ(JDK6 API Threadより) コンテキスト ClassLoader は、クラスおよびリソースをロードするときに、このスレッドで実行中のコードが使用するためにスレッドの作成側によって提供されます。コンテキスト ClassLoader が設定されていない場合、デフォルトでは親 Thread の ClassLoader コンテキストになります。通常、親スレッドのコンテキスト ClassLoader は、アプリケーションのロードに使用されるクラスローダーに設定されます。 なので、設定しなければシステムクラスローダがコンテキストクラスローダになる。 コンテキスト・クラスローダを設定・取得するには、java.lang.Thread#setContextClassLoader,getContextClassLoaderメソッドを使う。 クラスローダ作成 JDK6 APIより たとえば、アプリケーションはネットワーククラスローダーを作成して、サーバーからクラスファイルをダウンロードできます。コードは次のようになります。 ClassLoader loader = new NetworkClassLoader(host, port); Object main = loader.loadClass("Main", true).newInstance(); . . . ネットワーククラスローダーのサブクラスは、ネットワークからクラスをロードするために findClass メソッドと loadClassData メソッドを定義しなければなりません。クラスを作成するバイトを一度ダウンロードしたら、defineClass メソッドを使ってクラスインスタンスを生成する必要があります。実装の例を次に示します。 class NetworkClassLoader extends ClassLoader { String host; int port; public Class findClass(String name) { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } private byte[] loadClassData(String name) { // load the class data from the connection . . . } } 特定のディレクトリからクラスをロードするクラスローダを作成してみる。 MyClassLoaderのmainメソッドで、test.MyClassLoaderTargetをロードしClassを作成する MyClassLoaderはClassLoaderを継承したクラスで、loadClassメソッドをオーバライドし、c /mydoc/tmp/を優先的にロードするディレクトリとしている。c /mydoc/tmp/にクラスがない場合は、ClassLoaderのloadClassメソッドを実行する ClassLoaderのloadClassメソッドでは、キャッシュにあれば、そのクラスを返す。なければ親クラスローダに移譲する。なければシステムクラスローダを使ってクラスをロードする Class#newInstance()を実行して、インスタンスを生成する MyClassLoaderTarget#execute()を実行し、MyClassLoaderTarget2をnewしてexecute()を実行する 実行結果を見ると、MyClassLoaderTarget2のクラスローダは、MyClassLoaderであることがわかる。つまりクラスローダを使ってロードしたクラスから別のクラスをnewするときはそのクラスローダを使うことがわかる。クラスローダを作成すると親クラスローダはシステムクラスローダになる。 コンテキストクラスローダは明示的に使用しない限り、使われることはなさそう。 package test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MyClassLoader extends ClassLoader { private static final int BUFSIZE = 1024; private byte[] result; private int last = 0; @Override public Class ? loadClass(String name) throws ClassNotFoundException { Class ? c = null; try { c = findClass(name); } catch (ClassNotFoundException e) { c = super.loadClass(name); } return c; } private void dbg(String string) { System.out.println(string); } @Override protected Class ? findClass(String name) throws ClassNotFoundException { try { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } catch (Exception e) { throw new ClassNotFoundException(e.getMessage(), e); } } private byte[] loadClassData(String name) throws IOException { result = new byte[0]; last = 0; FileInputStream ins = null; try { byte[] buf = new byte[BUFSIZE]; int readSize = 0; name = name.replace( . , / ); File classFile = new File("c /mydoc/tmp/" + name + ".class"); ins = new FileInputStream(classFile); while((readSize = ins.read(buf)) != -1 ) { moveToResult(readSize, buf); } return result; } finally { if(ins != null) { ins.close(); } } } private void moveToResult(int readSize, byte[] buf) { byte[] tmp = new byte[last + readSize]; // 結果バイト配列をtmp配列の先頭にコピー System.arraycopy(result, 0, tmp, 0, result.length); // bufをtmp配列にコピー System.arraycopy(buf, 0, tmp, last, readSize); result = tmp; last += readSize; } public static void main(String[] args) { try { MyClassLoader loader = new MyClassLoader(); System.out.println("parent " + loader.getParent().getClass().getName()); Class ? clazz = loader.loadClass("test.MyClassLoaderTarget"); System.out.println("target class loader name " + clazz.getClassLoader().getClass().getName()); ((Executor)clazz.newInstance()).execute(); } catch (Exception e) { e.printStackTrace(); } } } package test; public class MyClassLoaderTarget implements Executor { @Override public void execute() { System.out.println("AAA"); MyClassLoaderTarget2 target2 = new MyClassLoaderTarget2(); target2.execute(); System.out.println("target2 class loader name " + target2.getClass().getClassLoader().getClass().getName()); } public static void main(String[] args) { MyClassLoaderTarget target = new MyClassLoaderTarget(); target.execute(); } } package test; public class MyClassLoaderTarget2 implements Executor { @Override public void execute() { System.out.println("BBB"); } public static void main(String[] args) { MyClassLoaderTarget2 target = new MyClassLoaderTarget2(); target.execute(); } } package test; public interface Executor { public void execute(); } 実行結果 parent sun.misc.Launcher$AppClassLoader target class loader name test.MyClassLoader AAA BBB target2 class loader name test.MyClassLoader ThreadLocal スレッドに固有のオブジェクトを保管するために使う(Thread Singleton)。Servletの中で、使用例としてDBに対するConnectionをスレッド毎に保管する場合があげられる。この場合、引数にConnectionを作成すると全てのメソッドにConnectionの引数が必要になり手間がかかる。スレッドにプライベートフィールドを作成して保管できないときに使える。 JDBC 参照 タイプ 説明 備考 type2 ベンダのライブラリと共同して、DBと通信。ベンダのクライアントアプリが必要。 type4 直接DBと通信。JDBCドライバサイズが大きい バッチ insert, updateが連続して行われるときにネットワークトラフィックを削減するために使う。PreparedStatementオブジェクトに対して、addBatch(), executeBatch()メソッドを使うと複数のステートメントをまとめてDBサーバ送信する。 言語コード コード名 説明 Windows-31J ShiftJISの拡張。NEC特殊コードもサポート。 スレッドダンプ 稼働中のスレッドを標準出力にダンプする。 kill -3 プロセス番号 出力例 daemon以外のスレッドを見る。以下の例ではSNMP APIで停止している。 Full thread dump Java HotSpot(TM) Server VM (11.2-b01 mixed mode) "RMI Scheduler(0)" daemon prio=10 tid=0x0955e000 nid=0x15db waiting on condition [0x30cd1000..0x30cd1fa0] java.lang.Thread.State TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for 0x37f243d8 (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java 198) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java 1963) at java.util.concurrent.DelayQueue.take(DelayQueue.java 164) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java 583) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java 576) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java 947) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java 907) at java.lang.Thread.run(Thread.java 619) "Thread-7" prio=10 tid=0x0954bc00 nid=0x15bf in Object.wait() [0x30eb7000..0x30eb7ea0] java.lang.Thread.State TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on 0xa89ec300 (a com.adventnet.snmp.snmp2.SnmpCallback) at com.adventnet.snmp.snmp2.SnmpCallback.sleepUntilNotified(SnmpCallback.java 166) - locked 0xa89ec300 (a com.adventnet.snmp.snmp2.SnmpCallback) at com.adventnet.snmp.snmp2.SnmpCallback.run(SnmpCallback.java 152) アノテーション 注釈。プログラムに影響を与えない。プログラムから読める。コンパイラの動作に影響を与える。 @Override Overrideアノテーションを付加したメソッドがオーバライドメソッドでなければコンパイルエラーになる。 @SuppressWarning Xlintを指定したときに発生する警告メッセージを抑制する。 アプレット jarファイルを指定するには、ARCHIVEタグを使う。CLASSPATHはきかない。 セキュリティポリシー java.policyファイルの構文 grant signedBy "signer_names", codeBase "URL", principal principal_class_name "principal_name", principal principal_class_name "principal_name", ... { permission permission_class_name "target_name", "action",signedBy "signer_names"; permission permission_class_name "target_name", "action",signedBy "signer_names"; ... }; ここで、"signer_names"、"URL"、principal_class_name、"principal_name"、permission_class_name、"target_name"、"action"、"signer_names"は、変数。 signedBy 、codeBase、、principal は省略可能。 意味は、signer_namesで署名されたURLにあるプログラムが、permission_class_nameで規定されるtarget_nameに対して、actionすることを許可する。target_name, actionについては、permission_class_nameのAPIを参照。 http //java.sun.com/j2se/1.5.0/ja/docs/ja/guide/security/PolicyFiles.html 参照。 例 permission java.io.FilePermission "\\\\192.168.1.40\\-", "read,write"; 192.168.1.40のリモートファイルに対する読み書きを許可する。 Linux firefoxへのJava Plugin インストール 例 # ln -s /usr/java/jdk1.6.0_20/jre/lib/i386/libnpjp2.so /opt/firefox/plugins インストールの確認 urlにabout pluginsを設定して開く Linuxでのplugin コントロールパネル 起動 $JAVA_HOME/bin/ControlPanel を実行 最大メモリ容量の修正 "-XX MaxPermSize=256m"をJavaタブのアプレットパラメータに追加 その他 スタックトレースをStringに変換する 仕事の都合で、最後の行で改行を削除してタブをスペースに変換している。 private String getStackTraceAsString(Exception e) { ByteArrayOutputStream ostream = new ByteArrayOutputStream(100); e.printStackTrace(new PrintStream(ostream)); String sep = System.getProperty("line.separator"); return ostream.toString().replaceAll(sep, "").replace("\t", " "); } 固定長レコードのファイルを出力 package test; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; public class SingleFille { private BufferedOutputStream bstream; /** * ファイルに書き込むデータ * 桁数 * 内容 */ private String[][] data = { {"aaa1", "bbb1", "ccc1"}, {"漢字2", "bbb2", "ccc2"}, {"aaa3", "漢字3", "ccc3"}, {"aaa4", "bbb4", "漢字4"}, }; /** 列の桁数 */ private int[] length = {10, 20, 30}; /** ファイルオフセット */ private int offset = 0; private static final String FILE_PATH = "singleFile.dat"; public static void main(String[] args) { SingleFille sfile = new SingleFille(); try { sfile.execute(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void execute() throws IOException { File file = new File(FILE_PATH); try { FileOutputStream stream = new FileOutputStream(file); bstream = new BufferedOutputStream(stream); for(int i = 0; i data.length; i++) { String[] line = data[i]; putFile(line); } } catch (IOException e) { throw e; } finally { if(bstream != null) { try { bstream.close(); } catch (IOException e) { throw e; } } } } /** * @param line * @throws IOException */ private void putFile(String[] line) throws IOException { for(int i = 0; i line.length; i++) { //各列を桁数になるように整形 byte[] term = createTerm(line[i], i); bstream.write(term); offset += term.length; } } /** * @param term * @param index * @return * @throws UnsupportedEncodingException */ private byte[] createTerm(String term, int index) throws UnsupportedEncodingException { //項目を格納するバイト byte[] outterm = new byte[length[index]]; //項目をShift_JISのバイトに変換 byte[] interm = term.getBytes("SJIS"); for(int i = 0; i outterm.length; i++) { if( i interm.length) { outterm[i] = interm[i]; } else { //残りはスペース outterm[i] = 0x20; } } return outterm; } }
https://w.atwiki.jp/anthony/pages/13.html
玄箱PRO-Java 玄箱PROはarmアーキテクチャなので利用できるJava環境の選択肢が少ない。 まず、今まで当たり前のように使用してきたSunのJDKがありません。さらに玄箱で使用していたPowerPC用のIBM-JDKも使えません。 (2007.12.25追記) Sunから評価版のARM/Linux版のJREが提供されています。説明を追加しました。 SunのJREを使う JDKはありませんが、SunからJREの評価版(http //java.sun.com/javase/embedded/index.jsp )を入手できます。(2007.12.25時点) ARM - Headless をクリックして幾つかの質問に答えたあと、ダウンロードすることができ、90日間の試用が可能です。 デフォルトでは使用可能文字コードが限られているので、x86版のJRE1.4.2に付属しているcharsets.jarを/opt/j2re1.4.2/libに追加するとほとんどの文字コードが使用できるようになります。 私の環境ではWindowsでダウンロードしたj2re-1.4.2_11-eval-b06-min-linux-arm.tar.gzをFTPで玄箱PROに転送して/optに展開しました。一緒にi386版のJRE1.4.2_12からcharsets.jarも/optに転送しています。 KUROBOX-PRO ~# cd /opt KUROBOX-PRO /opt# tar zxvf j2re-1.4.2_11-eval-b06-min-linux-arm.tar.gz KUROBOX-PRO /opt# cp charset.jar j2re1.4.2/lib KUROBOX-PRO /opt# export PATH=$PATH /opt/j2re1.4.2/bin KUROBOX-PRO /opt# java -version java version "1.4.2_11-eval" Java(TM) 2 Runtime Environment, Standard Edition for Embedded (build 1.4.2_11- eval-b06, headless) J2SE (build 1.4.2_11-b06, mixed mode) Evaluation version, 90 days remain in evaluation period ※2日間使用した後、java -versionで確認したら KUROBOX-PRO /opt# java -version java version "1.4.2_11-eval" Java(TM) 2 Runtime Environment, Standard Edition for Embedded (build 1.4.2_11- eval-b06, headless) J2SE (build 1.4.2_11-b06, mixed mode) Evaluation version, 88 days remain in evaluation period となりましたが、再び入手したtar.gzのファイルを展開したら90 daysに戻りました。どうやって残りの日数をカウントしているのでしょうか。 私は一度セットアップしてあったfree-java-sdkは削除しました。 かなり沢山のモジュールが導入されているので、すっきりきれいになりました。 SunのJREの使用感ですが、free-java-sdkで使用していたよりもストレスなく動作するようになった感じがします。 これに伴いJREだけで動作するTomcat5.5に移行しましたが、もったり感がなくなっています。 Sun以外のJDKを使う Debianのapt-getで入手できるarm対応Java環境で私が唯一Tomcatでの利用を確認できたのはfree-java-sdkだけです。 ※free-java-sdkの実体はSableVM ※関連パッケージ51個で83.7M使用します まずJava導入時の/etc/apt/sources.listの内容を確認 KUROBOX-PRO ~# vi /etc/apt/sources.list deb http //ftp.jp.debian.org/debian etch main contrib non-free deb-src http //ftp.jp.debian.org/debian etch main contrib non-free deb http //security.debian.org etch/updates main contrib non-free deb-src http //security.debian.org etch/updates main contrib non-free etchのmain contrib non-freeがあれば良いでしょう。 次にapt-getでfree-java-sdkの内容を確認 KUROBOX-PRO ~# apt-get update KUROBOX-PRO ~# apt-cache search free-java-sdk free-java-sdk - Complete Java SDK environment consisting of free Java tools KUROBOX-PRO ~# apt-cache depends free-java-sdkfree-java-sdk Depends jikes-sablevm Depends fastjar Depends sablevm Depends classpath-tools Suggests gjdoc Recommends libgnujaxp-java Conflicts sablevm 気になるならapt-cache show free-java-sdkで確認してみても良いです。 最後にapt-getでfree-java-sdkを導入する KUROBOX-PRO ~# apt-get install free-java-sdk KUROBOX-PRO ~# java -version SableVM version 1.13 - compile date and time 2006-09-09 15 34 20 UTC - gcc version 4.1.2 20060901 (prerelease) (Debian 4.1.1-13) - real life brokenness features enabled - signal based exception detection - copying garbage collection - bidirectional object layout - direct-threaded interpreter Tomcatから利用されるときはjava-sablevm経由になります。 引数やオプションはman java-sablevmで確認してください。 VMヒープサイズ指定がSunと異なるので気をつけましょう。下のは最大ヒープサイズ64Mを指定する場合の引数指定です。 java-sablevm -Dsablevm.heap.size.max=64000000 Class-Name 関連パッケージ ここまでの手順で導入されたパッケージを忘れないようにするためにここに残します。 あとで何に必要で、何で必要だったか分からなくなってしまうことが多かったのでメモは残すほうがいいですね。 KUROBOX-PRO ~# apt-get install free-java-sdk Reading package lists... Done Building dependency tree... Done The following extra packages will be installed classpath-tools defoma fastjar file fontconfig fontconfig-config java-common jikes jikes-sablevm libatk1.0-0 libcairo2 libexpat1 libffi4 libfontconfig1 libfreetype6 libglib2.0-0 libgtk2.0-0 libgtk2.0-common libice6 libjpeg62 libltdl3 libmagic1 libpango1.0-0 libpango1.0-common libpng12-0 libsablevm-classlib1-java libsablevm-native1 libsablevm1 libsm6 libtiff4 libx11-6 libx11-data libxau6 libxcursor1 libxdmcp6 libxext6 libxfixes3 libxft2 libxi6 libxinerama1 libxrandr2 libxrender1 libxtst6 perl perl-modules sablevm ttf-dejavu ucf unzip x11-common Suggested packages defoma-doc psfontmgr x-ttcidfont-conf dfontmgr gjdoc equivs libfreetype6-dev ttf-kochi-gothic ttf-kochi-mincho ttf-thryomanes ttf-baekmuk ttf-arphic-gbsn00lp ttf-arphic-bsmi00lp ttf-arphic-gkai00mp ttf-arphic-bkai00mp libsablevm1-dev libterm-readline-gnu-perl libterm-readline-perl-perl zip Recommended packages libft-perl libgnujaxp-java libatk1.0-data libglib2.0-data hicolor-icon-theme libgtk2.0-bin perl-doc debconf-utils The following NEW packages will be installed classpath-tools defoma fastjar file fontconfig fontconfig-config free-java-sdk java-common jikes jikes-sablevm libatk1.0-0 libcairo2 libexpat1 libffi4 libfontconfig1 libfreetype6 libglib2.0-0 libgtk2.0-0 libgtk2.0-common libice6 libjpeg62 libltdl3 libmagic1 libpango1.0-0 libpango1.0-common libpng12-0 libsablevm-classlib1-java libsablevm-native1 libsablevm1 libsm6 libtiff4 libx11-6 libx11-data libxau6 libxcursor1 libxdmcp6 libxext6 libxfixes3 libxft2 libxi6 libxinerama1 libxrandr2 libxrender1 libxtst6 perl perl-modules sablevm ttf-dejavu ucf unzip x11-common 0 upgraded, 51 newly installed, 0 to remove and 15 not upgraded. Need to get 1434kB/26.6MB of archives. After unpacking 83.7MB of additional disk space will be used. Do you want to continue [Y/n]? 最終更新日:2007-12-25
https://w.atwiki.jp/thiroyoshi/pages/47.html
senでwiki辞書を使う 以下で紹介されてる方法でできるらしい http //d.hatena.ne.jp/nodchip/20090309/1236615706 形態素解析 これまで、形態素解析にcabochaを使ってたわけですが、javaでMecabを実装したとかいうのがあったみたいで…。 http //ultimania.org/sen/ つーかYahoo!がそういうのしてくれるAPIを公開していたらしい。アンテナは大きく広げておかないといかんもんだなぁ… http //developer.yahoo.co.jp/webapi/jlp/da/v1/parse.html 下のサイトはサンプル公開してる。 http //www.nilab.info/zurazure2/001036.html 形態素解析の辞書 ChasenとMecabの辞書として使えるものだそうな。公開されてる精度がよすぎてびっくり。 http //www.tokuteicorpus.jp/dist/ Java使う人にはとてもよい http //nextindex.jp/java/ Stringの文字エンコーディング 普通にプログラムするには大して問題にならないファイル名の文字コード。 webでデータ公開するとかなるとなんかこれをよくミスる。 で、見つけたよさげなサイト。参考に http //hp.vector.co.jp/authors/VA017148/java/encoding.html デーモンスレッド 使えれば使う 参考URL http //memolet.blog22.fc2.com/blog-entry-792.html GC overhead limit exceeded 調べてみたら、ガベージコレクションに時間かかりすぎやから止まった、ってことらしい。 ガベージコレクション自体はメモリの自動解放とかしてくれるけど、メモリ使用量が多いとかでスワップが多くなったりすると処理がかかるみたいだ。 で、その時間がかかりすぎるとエラー吐いて止まるってのが上のメッセージらしい。 解決にはメモリをしっかり確保すればいいってのは当たり前だが、どうしても頻発する場合などには実行時の引数に以下のものを加えるといい。 -XX -UseGCOverheadLimit 参考URL http //confluence.atlassian.co.jp/display/DOC/Fix+Out+of+Memory+errors+by+Increasing+Available+Memory#FixOutofMemoryerrorsbyIncreasingAvailableMemory-OutOfMemoryError%3AGCoverheadlimitexceeded http //ameblo.jp/f-o-p/entry-10537149611.html MySQLと連携 javaのコードからMySQLを使う場合に、JDBCドライバが必要になる。 これはMySQLのサイトからダウンロードができる。 Javaとの連携なので、downloadの中の「Connector/J」をダウンロードする。 ダウンロードしたファイルを解凍すると、いろいろ入っているが、その中にjarがある。 名前は、「mysql-connector-java-5.0.8-bin.jar」だ。 これのクラスパスを通せば、あとはjavaのファイルの中で適切なコマンドを使っていけばいい。 参考URL http //mountainbigroad.jp/fc5/mysql_java.html MySQLからの日本語が文字化け まだいろいろ試していないもののメモ。 文字化けなので文字コードに問題があることは明白。 この場合にするべきは、各所での文字コードの設定。 「MySQLのデフォルト設定」 「javaコード内でのurl指定時」 くらいだが、これでも文字化けする場合があるのだ。 これはMySQLのバージョンを下げればいいこともあるらしい。 この問題があるのは、4.1.7でらしい。これをバージョンダウンすれば解消されるとさ。 またちょっとしたコードの書き換えでもいけるらしい。 str = new String(str.getBytes("ISO-8859-1"), "JISAutoDetect"); みたまんま、コード変換するみたいだ。これを取得した値に対して行ってやると解消されるとか。 でも、バージョンを下げるとこんなもんは必要ないみたい。 参考URL http //oshiete.goo.ne.jp/qa/1118005.html javaをコマンドラインで サーバーなどでjavaを動かすために覚えた。 しかし、コマンドを詳しく覚えているはずもなく… パスを通す .bashrcにjarファイルのパスをかたっぱしから通すように指定。 これぐらい重くもなんともないだろ! 実際に使ってるスクリプトは以下 jars=`ls /home/hiroyoshi/system/jar` for jar in ${jars[@]} do export CLASSPATH=$CLASSPATH /home/hiroyoshi/system/jar/$jar done やってることは簡単で、jarのファイル名を配列で全部とってきて、それにパスを当てはめてexportしてるだけ。 これでディレクトリjarにjarを追加するだけで、ログインするときに毎回読み込んでくれる。 もうパスを通す必要はない!便利! コンパイル 使ったのは実際には以下のコマンド javac -sourcepath XX/src -d XX/bin/ XX/src*/*.java XXはディレクトリ名(プロジェクト名とか) javac javaのコンパイルコマンド -sourcepath ソースファイルの場所指定オプション -d クラスファイルの出力場所指定オプション これで、srcに保存されいるパッケージでまとめられているjavaソースファイルをきちんとコンパイルできる。 また、このコンパイル時にbin内にパッケージも作られる。 ただし、srcとbinは事前に作っておく必要があるのは言うまでもない。 実行 ちょっと泥臭い方法になってしまったというか、メモるほどの事ではないが一応。 java -Xmx1g main/Main これをbinで行う。ほんとはプロジェクトのホームで実行したかったけど仕方ない…。 ファイルなどを生成するのでも、プログラム内でディレクトリ指定すればbin内には作らなくて済むので。 RSSリーダー 研究でブログを扱っているので作ってみたところのメモ。 ほとんどコピペやけど、プログラムってそんなもん。 使ってるライブラリ ROME:本プログラムのキモ。RSSを扱うためのメソッドが揃ってるみたい。 基本はこのROMEで処理します。依存とかの関係で ROME-Fetcher JDOM も必要です。JDOMはxmlを扱うライブラリで、これがないとROMEは動かない。 それぞれのライブラリはバイナリをダウンロードする。 JDOMは圧縮形式でダウンロードでき、解凍するとディレクトリができる。 この中からjdom.jarを見つけ出す。 サンプル public class RSSReader { @SuppressWarnings("unchecked") public static void main(String[] args) { //rdfでもxmlでもOK String url = "http //blog.livedoor.com/xml/article_ranking.rdf"; try { URL feedUrl = new URL(url); SyndFeedInput input = new SyndFeedInput(); SyndFeed feed = input.build(new XmlReader(feedUrl.openStream())); ArrayList SyndEntry entries = (ArrayList SyndEntry ) feed.getEntries(); System.out.println("Blog Title:" + feed.getTitle()); System.out.println("======================="); Iterator SyndEntry it = entries.iterator(); SyndEntry entry; while(it.hasNext()){ entry = it.next(); System.out.println("Title:" + entry.getTitle()); System.out.println("Date:" + entry.getPublishedDate()); System.out.println("Link:" + entry.getLink()); System.out.println("URI:" + entry.getUri()); System.out.println("Description:" + entry.getDescription().getValue()); System.out.println("---------------------"); } System.out.println("size = " + entries.size()); } catch (FeedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 参考URL スマートネットワーク開発ブログ JavaでRSSのパースをしてくれるライブラリ ROME 正規表現 すごく便利な正規表現。でもすごくわかりにくい正規表現。 そんな正規表現のメモ。 (特にJavaで使えるというものです) 全角記号 [^ぁ-んァ-ヴ一-龠0-90-9a-zA-Zー〜、] 総当たりではあるが、使えるのでよし。 意味は「ひらがなとかカタカナとか以外」 半角記号 \p{Punct} javaのAPIで定義されているものそのまま。 ただし、使うときにはこれをこのまま書くだけだと、「エスケープシーケンスは…」と怒られるので、こいつをエスケープしてやる。 つまり、 line = line.replaceAll("\\p{Punct}",""); ってすると、line内の半角記号は一掃される。 半角カタカナ [。-゚+] そのまま文字コードにのっとったもの。つまり、意味は ー。「」、・ヲァィゥェォャュョッタアイウエオカキクケコサシスセソミチツテトナニヌネノハヒフヘホマムメモヤユヨラリルレロワン゙゚ です。 また、正規表現の[a-z]のような「-」(ハイフン)の範囲表現はASCIIコードに準じたものをなっている。(参考URL参照) 例えば、コード表によると「!」から「/」を続けて範囲指定([!-/])できるが、「?」までする([!-?])と数字も選択されてしまう。 参考URL フジハラボ:Javaで入力チェックに使える正規表現まとめ ASCII文字コード
https://w.atwiki.jp/kodan/pages/21.html
[java] JDKインストール [java] 用語 [java] リフレクション [java] javadoc作成 [java] スレッド名取得 [java] スレッド名取得2 [java] 型、キャスト [java] LOBファイル操作方法 [java] content-type設定 [java] Servlet [java] session [java] DataHandler [java] アノテーション [java] ファイルロック [java] Set [java] PostMethodのリダイレクト [java] InputStream⇒String
https://w.atwiki.jp/note4recurrent/pages/29.html
2022/08/24 動的web html:httpサーバー(Apacheなど)がファイル(htmlやimg)を送り返すだけ。今どきのページではJavascriptで埋め込んだコンテンツ(動画など)を同時に送り返すものも多いが。 JAVAの動的web:httpサーバーからアプリケーション・サーバー上で実行されているプログラム(JAVAなど)を呼び出して実行された結果をhtmlで受け取とる。 JAVAの場合、サーブレットとJSPで実装される。 サーブレットはクラスファイル:JAVAのクラスの一種。htmlを出力するメソッドを持っているイメージ。 JSPファイルで中身はhtmlに近い。htmlにjavascriptを埋め込んだようなイメージ。 サーブレット javaプログラムとhtmlの部分以外は、決り文句なのでコピペでOK。 doGet(),doPost() で受け取る doGet はブラウザのアドレスバーから呼び出されたような場合やgetメソッドで呼び出された時に実行されるメソッド。 doPost()は他のサーブレットやJSP、htmlのリンクから呼び出された時に実行される。 htmlを書き出すときは「PrintWriter out = response.getWriter()」 で宣言したインスタンス(この場合はout)のprintlnメソッドにhtml文字列を引数として渡す。このパターンで覚えておけばいい(前に書いたものからコピペすればいい)。 サーブレットの特徴 サーブレットはメソッドだが、「サーバー上で実行」されたときにインスタンス化されているので、どこかでnewすることはない。サーバー上に常駐し、リクエストを待っている状態と考えればよい。 サーブレットはクラスなので、htmlの書き出し部分でもjavaで作った変数をそのまま使える。 サーブレットはJAVAのクラスなので、src配下に置く。 URLパターン:サーブレットを呼び出すためのURLは、基本的にはサーバー/プロジェクト名/サーブレット名と考えれば良い。サーブレット名はサーブレット内の@WebServlet("/ExServlet") に書かれる。 2022/08/29 前先生 JSP JavaServletPage Eclipsの管理上はhtmlと同じフォルダに置く。(授業ではWebContent)サーブレットと異なることに注意。 htmlにJAVAのコードを埋め込むような感じなので、凝ったレイアウトのhtmlファイルを作りやすい。作り込んだhtmlをもらってJAVAを埋め込むといった使い方が主流。 JAVAのifやloopでhtmlの出力を動的に変えることが可能。 サーブレットと同様、htmlとJSPの決り文句はコピペでOK。 コメントの書き方が異なるので注意。間違えると、画面に表示されたりサーバーエラーになる。 if分やfor分のブロックを閉じる閉じのカッコ” %}% ”を忘れやすいので注意。インデントを勝手にやってくれないので見ずらい。 練習問題 通常のJAVAクラスを作って、JSPから呼び出す練習をした。 import する必要がある。それ以外は普通のクラスの呼び出しと一緒。 Form html 部分は通常のhtmlファイルと同様。 submit を post でするとURLに入力した値は表示されない。getだと表示される。 ラジオボタンとチェックボックスの取得方法は次回。 2022/08/31 フォーム StringBuilder sb = new StringBuilder(); sb.append(value); ストリング変数に+で追加するよりメモリ効率が良く速い。Stirngはオブジェクトで+すると新しくオブジェクトを作って値を入れる。 forward は同じプログラム内のサーブレット、JSPしか呼べない Redirect は制限がない。ネットでつながっているところならどこでも呼べる。 下の行はコメントアウトすること //response.getWriter().append("Served at ").append(request.getContextPath()); knowledge.length 配列の個数を調べるときは()がいらない。普通はhensu.length() 2022/09/07 10章 練習課題:7章の例題をコピペすればOK。来週の修了テストもほとんど同じなので、回答をもらって名前とLogicを触ればいい(はず)。 model DataType データをやり取りするためのjavabeans(クラス):input,input2,input3とそれぞれのgetter,setterを持つだけ。 Logic 入力された文字列をつないでDataTypeのinput3にsetするだけのクラス(Control.javaの中で呼び出される:引数はDataType) servlet Control.servlet postを受けてDataTypeをnewし、Logicで文字列をつないでリクエストスコープにDataTypeを保存して、 result.jspをforward WebContent index.jsp 入力フォーム:postでControlに文字列を2つ投げるだけ Web-INF(フォルダ)jsp(フォルダ) output.jsp Control.servlet からforward で呼び出される。リクエストスコープに入っている DataTypeを受け取って表示するだけ。 2022/09/08 import java.sql.*; mySQLの場合 public static void m01() throws Exception { System.out.println( "===== m01() Mysql Sys に接続" ); Class.forName("com.mysql.cj.jdbc.Driver"); String dburl = "jdbc mysql //localhost 3306/sys?characterEncoding=UTF-8 serverTimezone=Asia/Tokyo"; String sql = "SELECT * FROM version"; ----テーブル名 Connection conn = DriverManager.getConnection(dburl, "root", "root");---MySQLのログイン情報 Statement statement = conn.createStatement(); //statement.executeUpdate(sql); ---select 以外 ResultSet rs = statement.executeQuery(sql);---select の場合 //結果の表示 while( rs.next() ) { String sysVer = rs.getString("sys_version"); String mysqlVer = rs.getString("mysql_version"); System.out.println( sysVer + ", " + mysqlVer ); } //開いた順番と逆に閉じる事 rs.close(); statement.close(); conn.close(); } MySQL につなぐための準備 connector/j をダウンロード https //dev.mysql.com/downloads/connector/j/8.0.html https //dev.mysql.com/downloads/file/?id=513221 "C \pleiades\tomcat\9\lib\mysql-connector-java-8.0.30.jar" ビルドパスの構成が必要になるので注意。(外部JARを追加する) ビルドパス>ビルドパスの構成(ダイヤログ)>ライブラリータブ選択>モジュールパスを選択>外部JARの追加ボタン>ファイルダイヤログでダウンロードしたJARを選択>適用して閉じる 動的webプロジェクト作成手順 スッキリわかるサーブレット&JSP入門第2版に合わせるための設定 java11,tomcat9 を使うこと ファイルメニュー「新規」:動的webプロジェクト プロジェクト名入力 ターゲット・ランタイム確認: 構成ボタンを押す javaのバージョンが一致しているか確認(今は11)。必要があれば修正 次へボタン 表示されているフォルダを選んで「除去」ボタンを押し消す 「フォルダーの追加」ボタンを押し、 「src」 を作成:「次へ」ボタン コンテンツ・ディレクトリーを「WebContent」に変更し完了 (出来上がったプロジェクトをパッケージ・エクスプローラーで開く) srcフォルダを右クリックし「新規」フォルダー:model srcフォルダを右クリックし「新規」フォルダー:servlet WebContentの中のWEB-INFフォルダを右クリックし「新規」フォルダー:jsp 運用 javaのクラスファイルはmodelフォルダに入れる servlet はservlet フォルダに入れる jspファイルはWebContent/ENF-WEB/jsp に入れる。ここに置いたjspファイルはservletから(redirect,forward)で呼ばないと開かない。 外部からアクセスできるjspは WebContent 直下に入れる スコープ:共有みたいなところ スコープにはインスタンス(クラスからnewしたもの)しか置けない。 intやdoubleは置けないが String はおける(Stringはそれ自体がオブジェクトだから)。 添付ファイル:macのファイルなのでwindowsで関係ないファイルが見えることがあるかもしれません。削除しても放置しても構いません。 Chap99.zip 基本 Chap99 -remake.zip フッターを動的インクルードで入れたもの JAVApdf Chap99の説明 java2.pdf 入力チェックの説明 2022/09/14 正規表現 数値でマイナスと小数点を受け付ける:"^[+-]?([1-9]\\d*|0)(\\.\\d+)?$"